#pragma once
#include <iostream>
#include <string>
#include <cstdarg>
#include <cstdio>
#include <time.h>
#include <unistd.h>
#define DEBUG   0
#define NORMAL  1    //正常
#define WARNING 2
#define ERROR   3    //普通错误，可以正常运行
#define FATAL   4    //严重错误，不能正常运行

char* tostring_level(const int level)
{
    switch (level)
    {
        case DEBUG:     return "DEBUG";
        case NORMAL:    return "NORMAL";
        case WARNING:   return "WARNING";
        case ERROR:     return "ERROR";
        case FATAL:     return "FATAL";
        default: return nullptr;
    }
}

//可变参数列表
//void debugLog(DEBUG,"hello %f %d %c",3.14,10,'C') 
void debugLog(const int level,const char* format, ...)  //可变参数列表,参数的压栈顺序从右向左的，形参实例化也是从右向左的
{
    // //[日志等级][2023-7-23][pid][message]
    // va_list start;  //时char*的一个字节的，通过地址+偏移量=后面的参数，在栈帧结构中进行寻址
    // va_start(start);
    //while(*p!=nullptr)
    // switch(*p)
    //{
    //     case '%':
    //         p++;
    //         if(p=='f') va_arg(start,float)
    //         ...
    // }
    // va+arg(start,float); //移动float个偏移量
    // va_end(start);     //

#define log_err "./logerror.err"
#define log_mes "./logmessage.txt"

#define NUM 1024
    char logprofix[NUM];  //得到[日志等级][2023-7-23][pid]等信息
    char logcontent[NUM];  //得到后面的可变参数列表信息

    snprintf(logprofix,sizeof(logprofix),"[%s]-[%ld]-[%d]",tostring_level(level),(long int)time(nullptr),getpid());
    va_list arg;
    va_start(arg,format);
    vsnprintf(logcontent, sizeof(logcontent),format,arg);
    //把这些日志信息写进文件里面
    FILE* err = fopen(log_err,"a");  //以追加的方式打开
    FILE* mes = fopen(log_mes,"a");  //以追加的方式打开
    if(mes ==NULL || err ==NULL)
    {
        exit(errno);
    }
    std::string message = logprofix;
    message+=logcontent;
    message+="/n";
    if(level<3) fwrite(message.c_str(),message.size(),NUM,mes);
    else fwrite(message.c_str(),message.size(),NUM,err);
    fclose(err);
    fclose(mes);

}

